//
// Created by DengLibin on 2018/12/12 0012.
//
/**
 * 文件流
 */

#include <stdio.h>
#include <stdlib.h>
#include <direct.h>
#include "string.h"
#include "time.h"
#include "errno.h"
#include "io.h"
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
using namespace std;
/*cin,cout,ifstream,ofstream,istringstream,ostringstream是对应的输入输出类。而fstream和stringstream类是可以同时进行输入和输出。
ios::in 输入方式打开文件
ios::out 输出方式打开文件(默认)
ios::app 输出方式打开文件,数据添加到文件末尾
ios::ate 打开一个已有的文件，文件指针指向末尾
ios::binary       二进制模式
ios::nocreate	打开一个文件时，如果文件不存在，不创建文件。
ios::noreplace	打开一个文件时，如果文件不存在，创建该文件
ios::trunc 打开一个文件，如果文件已经存在，则删除其中全部数据，如果文件不存在则创建新的文件，如果只指定了out而没有指定app或则ate，则默认是trunc
*/
//文件输出流
void fileOut()
{

    string fileName = "d:\\a.txt";

    ofstream fout(fileName,ios::out | ios::app);//追加,没有文件会自动新建
    fout << "1231232134" << endl;
    fout << "23423423423424" << endl;
    char buf[1024];
    cin.getline(buf,sizeof(buf));
    fout << buf << endl;
    fout.close();
}
//文件输入流
void fileIn()
{
    string fileName = "d:\\a.txt";
    ifstream fin(fileName, ios::in);//如果文件不存在则打开失败
    //读文件

    //单个输出
    /*char ch;
    while (fin.get(ch))
    {
        cout << ch;
    }*/
    //cout << fin.rdbuf();//将整个文件内容输出到标准输出流

    //输出一行
    char buf[1024];
    while (fin.getline(buf, 1024))
    {
        cout << buf<<endl;
    }
    fin.close();
}

//复制一张图片
void copyPic()
{
    string in_file_name = "D:\\1.jpg";
    ifstream fin(in_file_name, ios::in | ios::binary);
    string dir = "d:\\aa";
    int isSuccess = _mkdir(dir.c_str());
    if (isSuccess == 0)
    {
        cout << "创建文件夹aa成功" << endl;
    }
    string out_file_name = dir+"\\1_copy.jpg";//aa文件夹必须存在
    ofstream fos(out_file_name, ios::out | ios::binary | ios::app);
    /*
    char ch;
    while (fin.get(ch))
    {
    fos << ch;
    }*/

    fos << fin.rdbuf();//rdbuf的作用是输出整个文件内容
    //关闭流
    fin.close();
    fos.close();
}

//复制文件(带缓冲区)
void copyFile()
{
    string inFileName = "D:\\DiskGenius.rar";
    ifstream is(inFileName, ios::in | ios::binary);
    string outFileName = "D:\\DiskGenius_copy.rar";
    ofstream os(outFileName, ios::out | ios::binary);
    char *buf = new char[1024];
    while (!is.eof()) //判断是否到达文件末尾
    {
        memset(buf,0,1024);
        is.read(buf,1024);
        os.write(buf,1024);
    }
    is.close();
    os.close();
    delete[] buf;

}
//判断文件是否存在
void fileExist()
{
    //第一种方式
    string filePath = "d:\\a.txt";
    ifstream fin(filePath);
    if (!fin)
    {
        std::cout << "文件不存在" << endl;
    }
    else
    {
        std::cout << "文件存在" << endl;
    }
    fin.close();

    //第二种方式
    /*
00——只检查文件是否存在

02——写权限

04——读权限

06——读写权限
    */
    int exist = _access(filePath.c_str(),0);
    if (exist == 0)
    {
        std::cout << "文件存在" << endl;
    }
    else
    {
        std::cout << "文件不存在" << endl;
    }
}
int main16(int argc, char* argv[])
{
   // fileOut();
    fileIn();
    //copyPic();
    //copyFile();
    //fileExist();
    //system("pause");
    return 0;
}